// 全局jwt认证守卫
import { ExecutionContext,Injectable,UnauthorizedException } from "@nestjs/common";
import { Reflector } from "@nestjs/core";
import { AuthGuard } from "@nestjs/passport";
import { Observable } from "rxjs";
import {IS_PUBLIC_KEY} from '../decorator/public'

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
    constructor(
        private reflector:Reflector
    ){
        super()
    }

    canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
        // 在这里添加自定义的认证逻辑
        const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY,[
            context.getHandler(),
            context.getClass()
        ])
        // 一旦使用@Public()自定义装饰器，就通过
        if(isPublic) {
            return true
        }
        
        return super.canActivate(context)
    }

    handleRequest(err: any, user: any) {
        if(err || !user) {
            throw err || new UnauthorizedException()
        }
        return user
    }
}